/*
 * CVideoDecoder.h
 *
 *  Created on: 2016年4月14日
 *      Author: terry
 */

#ifndef CVIDEODECODER_H_
#define CVIDEODECODER_H_

#include "VideoDecoder.h"
#include "PacketQueue.h"
#include "MultiThread.h"


namespace av
{

class CVideoDecoder: public VideoDecoder, public comn::Thread
{
public:
	explicit CVideoDecoder(MediaDecoderSink* sink);
	virtual ~CVideoDecoder();

    virtual int open(const MediaFormat& fmt);

    virtual void close();

    virtual bool isOpen();

    virtual int input(AVPacketPtr pkt);

    virtual void setSink(MediaDecoderSink* sink);

    virtual void flush();

    virtual bool getOutFormat(RawMediaFormat& fmt);

protected:
    virtual int run();
    virtual void doStop();

protected:
    void fireFrame(AVFramePtr frame);

    AVPacketPtr waitAndGet(int ms);

    AVFramePtr decode(AVPacketPtr& pkt);

protected:
    MediaDecoderSink*	m_sink;
    AVCodecContext*		m_codecCtx;
    PacketQueue		m_pktQueue;

};

} /* namespace av */

#endif /* CVIDEODECODER_H_ */
